/*****************************************************************************
光标控制
\033[nA    光标上移n行
\03[nB     光标下移n行
\033[nC    光标右移n行
\033[nD    光标左移n行

\033[s     保存光标位置
\033[u     恢复光标位置
\033[y;xH  设置光标位置


\033[?25l  隐藏光标
\033[?25h  显示光标

字符格式控制
\033[0m     关闭所有属性,恢复系统显示背景,前景色
\033[1m     高亮显示字符 低亮高亮
\033[4m     下划线
\033[5m     闪烁
\033[7m     反显
\033[8m     消隐
\033[3cm    设置前景色
\033[4cm    设置背景色

清除显示
\033[2J    清屏
\033[K     清除从光标到行尾的内容


颜色色值
\033[30m ---- \033[37m 各种不同的前景色
30    Black        31    Red
32    Green        33    Yellow
34    Blue         35    Magenta
36    Cyan         37    White
\033[40m ---- \033[47m 各种不同的背景色
40    Black        41    Red
42    Green        43    Yellow
44    Blue         45    Magenta
46    Cyan         47    White
*****************************************************************************/
#include<stdio.h>
#include <unistd.h>


#define     COLOR_RED              31
#define     COLOR_BLACK            30
#define     COLOR_GREEN            32
#define     COLOR_BLUE             34
#define     COLOR_YELLOW           33
#define     COLOR_WHITE            37
#define     COLOR_CYAN             36
#define     COLOR_MAGENTA          35

//清屏
void clear_screen(void);
//清除从光标位置到行末的内容
void clear_to_end(void);
//光标移动到(x,y)
void cusor_moveto(int x, int y);
//保存光标位置
void cusor_get_pos(void);
//恢复光标位置
void cusor_set_pos(void);
//光标上移num行
void cusor_up(int num);
//光标下移num行
void cusor_down(int num);
//光标左移num个字符
void cusor_lift(int num);
//光标右移num个字符
void cusor_right(int num);
//设置前景颜色
void set_fg_color(int color);
//设置背景颜色
void set_bg_color(int color);



int ESC = 27;

//清屏
void clear_screen(void)
{// ESC[2J
    printf("%c[2J",ESC);
    fflush(stdout);
}

//清除从光标位置到行末的内容
void clear_to_end(void)
{// ESC[K
    printf("%c[K",ESC); fflush(stdout);} //光标移动到(x,y)
void cusor_moveto(int x, int y)
{// ESC[y;xH
    printf("%c[%d;%dH",ESC,y,x);
    fflush(stdout);
}

//保存光标位置
void cusor_get_pos(void)
{// ESC[s
    printf("%c[s",ESC);
    fflush(stdout);
}

//恢复光标位置
void cusor_set_pos(void)
{// ESC[u
    printf("%c[u",ESC);
    fflush(stdout);
}

//光标上移num行
void cusor_up(int num)
{
    while(num--)
    { // up =  ESC[A
        printf("%c[A",ESC);
    }   
    fflush(stdout);
}

//光标下移num行
void cusor_down(int num)
{
    while(num--)
    {// down = ESC[B
        printf("%c[B",ESC);               
    }
    fflush(stdout);
}

//光标左移num个字符
void cusor_lift(int num)
{
    while(num--)
    {// lift = ESC[D
        printf("%c[D",ESC);               
    }
    fflush(stdout);
}

//光标右移num个字符
void cusor_right(int num)
{
    while(num--)
    {// right = ESC[C
        printf("%c[C",ESC);               
    }
    fflush(stdout);
}

//设置前景颜色
void set_fg_color(int color)
{// ESC[#m
    printf("%c[%dm",ESC,color);
    fflush(stdout);
}

//设置背景颜色
void set_bg_color(int color)
{// ESC[#m
    printf("%c[%dm",ESC,(color+10));
    fflush(stdout);
}


int main()
{
    int x=0;int y = 0;
    int color=31;
    clear_screen();    
    cusor_moveto(20,10);
    while(1)
    {
        cusor_get_pos();
        printf("(20,10)");
        fflush(stdout);
        sleep(1);
        cusor_up(5);
        sleep(1);
        cusor_down(5);
        sleep(1);
        cusor_right(5);
        sleep(1);
        cusor_lift(5);
        sleep(1);
        cusor_moveto(50,10);
        printf("(50,10)/n");
        sleep(1);
        set_bg_color(COLOR_BLACK);
        set_fg_color(COLOR_RED);
        printf("/nsdfasdfasdf/n");
        sleep(1);
        set_bg_color(COLOR_YELLOW);
        set_fg_color(COLOR_GREEN);
        printf("sdfasdfasdf/n");
        cusor_set_pos();
        while(1);
    }
    return 0;
}

